/*
 * @(#)SelfClassLoader.java 2010-4-18
 * 
 * Copyright 5jxiang . All rights reserved.
 */
package com.jz.util;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.WritableByteChannel;

/**
 * <p>
 * <a href="SelfClassLoader.java.html"><i>View Source</i></a>
 * </p>
 *
 * @author 5jxiang
 * @version $Id$
 */
public class SelfClassLoader extends ClassLoader {
	protected Class findClass(String name) throws ClassNotFoundException {
	    byte[] bytes = loadClassBytes(name);
	    Class theClass = defineClass(name, bytes, 0, bytes.length);
	    if (theClass == null)
	    throw new ClassFormatError();
	    return theClass;
   }
   private byte[] loadClassBytes(String className) throws
        ClassNotFoundException {
   try {
	   String classFile = getClassFile(className);
	   FileInputStream fis = new FileInputStream(classFile);
	   FileChannel fileC = fis.getChannel();
	   ByteArrayOutputStream baos = new
	   ByteArrayOutputStream();
	   WritableByteChannel outC = Channels.newChannel(baos);
	   ByteBuffer buffer = ByteBuffer.allocate(1024);
	   while (true) {
	        int i = fileC.read(buffer);
	        if (i == 0 || i == -1) {
	         break;
	         }
	         buffer.flip();
	         outC.write(buffer);
	         buffer.clear();
	       }
	       fis.close();
	       return baos.toByteArray();
	     } catch (IOException fnfe) {
	       throw new ClassNotFoundException(className);
	     }
   }
   
	private String getClassFile(String name){
	     StringBuffer sb = new StringBuffer(SelfClassLoader.class.getResource("/").getPath());
	     name = name.replace('.', File.separator.charAt(0)) + ".class";
	     sb.append(File.separator + name);
	     return sb.toString();
     }
}
